#include <algorithm>
#include <bits/stdc++.h>
using namespace std;

// 通用的算法
template<class T>
void show( T &s )
{
    while( !s.empty() )
    {
        cout << s.top() << endl;
        s.pop();
    }
}

// 针对一些特定的无法使用上述通用算法的数据类型
// 我们要采用特定的算法：
template <>
void show( stack< list<int> , std::deque< list<int> > > & s)
{
    while( !s.empty() )
    {
        // 取得s中的链表元素
        list<int> tmp = s.top();

        // 遍历枚举链表中的各个元素
        for(int i : tmp)
            cout << i << "  ";

        s.pop();
        cout << endl;
    }
}


int main(int argc, char const *argv[])
{
    // 创建一个元素类型为int，底层容器类型为双端队列的栈
    stack<int, std::deque<int> > s1;

    // 插入一些元素
    s1.push(1);
    s1.push(2);
    s1.push(3);

    // 逐个弹栈，并显示出来
    show(s1);
    if(s1.empty())
        cout << "s1 已为空" << endl;

    // 创建一个元素类型为字符串，底层容器类型为链表的栈
    stack< string, list<string> > s2;

    // 插入一些元素
    s2.push("abc");
    s2.push("xyz");
    s2.push("123");

    // 逐个弹栈，并显示出来
    show(s2);
    if(s2.empty())
        cout << "s2 已为空" << endl;


    // 创建一个元素类型为整型链表，底层容器类型为双端队列的栈
    stack< list<int> , std::deque< list<int> > > s3;

    list<int> l1 = {11,22,33};
    list<int> l2 = {44,55,66,77,88};
    list<int> l3 = {99};

    // 插入一些元素
    s3.push(l1);
    s3.push(l2);
    s3.push(l3);

    // 逐个弹出，并显示出来
    show(s3);
    if(s3.empty())
        cout << "s3 已为空" << endl;

    return 0;
}
